function success = importReqIFasReq(parentFigure, messageTextArea)
%IMPORTREQIFASREQ 完整的ReqIF导入到Requirements Toolbox功能
%   使用MATLAB内置的slreq.import接口导入ReqIF文件到slreqx格式
%   支持用户友好的图形界面、进度显示和错误处理
%
%输入参数:
%   parentFigure - 父界面句柄（用于显示对话框）
%   messageTextArea - 消息文本区域句柄（用于显示状态信息）
%
%输出参数:
%   success - 导入是否成功（true/false）
%
%功能特性:
%   - 基于MATLAB内置ReqIF导入接口 (slreq.import)
%   - 支持选择现有或创建新的slreqx文件
%   - 实时进度显示和详细错误日志
%   - 支持ReqIF 1.0/1.1/1.2标准
%   - 完善的错误处理和用户反馈机制
%
%支持的ReqIF特性:
%   - 需求对象 (SpecObjects) 
%   - 需求属性 (Attributes)
%   - 需求层次结构 (SpecHierarchy)
%   - 需求关系 (SpecRelations)
%   - 自定义属性类型 (AttributeDefinitions)
%
%使用示例:
%   success = importReqIFasReq(app.MainFigure, app.MessagesTextArea);
%
%依赖项:
%   - MATLAB Requirements Toolbox
%   - MATLAB R2020b及以上版本
%
%作者: MBD Platform Team
%版本: 1.0
%日期: 2024

success = false;

try
    % 1. 选择ReqIF文件
    [reqifFileName, reqifPath] = uigetfile('*.reqif', '选择ReqIF需求文件');
    if isequal(reqifFileName, 0)
        return; % 用户取消
    end
    reqifFullPath = fullfile(reqifPath, reqifFileName);
    
    updateMessage(messageTextArea, sprintf('选择ReqIF文件: %s', reqifFileName));
    
    % 2. 验证ReqIF文件
    if ~exist(reqifFullPath, 'file')
        uialert(parentFigure, '所选的ReqIF文件不存在！', '错误', 'Icon', 'error');
        return;
    end
    
    updateMessage(messageTextArea, '验证ReqIF文件格式...');
    
    % 简单的ReqIF文件格式验证
    if ~validateReqIFFile(reqifFullPath)
        uialert(parentFigure, '所选文件不是有效的ReqIF格式！', '错误', 'Icon', 'error');
        return;
    end
    
    % 3. 选择目标slreqx文件
    [targetReqSet, isNewFile, targetFilePath] = selectTargetRequirementSet(parentFigure, messageTextArea);
    if isempty(targetReqSet)
        return; % 用户取消
    end
    
    % 4. 执行ReqIF导入
    updateMessage(messageTextArea, '开始导入ReqIF数据...');
    
    success = executeReqIFImport(reqifFullPath, targetReqSet, isNewFile, targetFilePath, parentFigure, messageTextArea);
    
catch ME
    uialert(parentFigure, sprintf('ReqIF导入过程发生错误：\n%s', ME.message), '错误', 'Icon', 'error');
    success = false;
end

end

% ===== 辅助函数 =====

function isValid = validateReqIFFile(filePath)
%VALIDATEREQIFFILE 简单验证ReqIF文件格式
%   检查文件是否包含基本的ReqIF XML结构

isValid = false;

try
    % 读取文件前几行，检查是否包含ReqIF标识
    fid = fopen(filePath, 'r', 'n', 'UTF-8');
    if fid == -1
        return;
    end
    
    % 读取前1000个字符进行格式检查
    content = fread(fid, 1000, '*char')';
    fclose(fid);
    
    % 检查ReqIF文件特征
    if contains(content, '<?xml') && ...
       (contains(content, 'REQ-IF') || contains(content, 'reqif') || contains(content, 'ReqIF'))
        isValid = true;
    end
    
catch
    % 文件读取失败，认为格式无效
    isValid = false;
end

end

function [targetReqSet, isNewFile, targetFilePath] = selectTargetRequirementSet(parentFigure, messageTextArea)
%SELECTTARGETREQUIREMENTSET 选择或创建目标需求集文件
%   让用户选择导入到新文件还是现有文件

targetReqSet = [];
isNewFile = false;
targetFilePath = '';

try
    choice = questdlg('请选择目标需求集文件', 'ReqIF导入 - 目标选择', ...
                     '创建新需求集', '导入到现有需求集', '取消', '创建新需求集');
    
    switch choice
        case '创建新需求集'
            [fileName, pathName] = uiputfile('*.slreqx', '创建新的需求集文件');
            if isequal(fileName, 0)
                return; % 用户取消
            end
            
            targetFilePath = fullfile(pathName, fileName);
            updateMessage(messageTextArea, sprintf('创建新需求集: %s', fileName));
            
            % 创建新的需求集
            targetReqSet = slreq.new(targetFilePath);
            isNewFile = true;
            
        case '导入到现有需求集'
            [fileName, pathName] = uigetfile('*.slreqx', '选择现有需求集文件');
            if isequal(fileName, 0)
                return; % 用户取消
            end
            
            targetFilePath = fullfile(pathName, fileName);
            updateMessage(messageTextArea, sprintf('选择现有需求集: %s', fileName));
            
            % 打开现有需求集
            targetReqSet = slreq.open(targetFilePath);
            isNewFile = false;
            
        otherwise
            % 用户取消
            return;
    end
    
catch ME
    uialert(parentFigure, sprintf('选择目标文件失败：\n%s', ME.message), '错误', 'Icon', 'error');
    targetReqSet = [];
end

end

function success = executeReqIFImport(reqifFilePath, targetReqSet, isNewFile, targetFilePath, parentFigure, messageTextArea)
%EXECUTEREQIFIMPORT 执行实际的ReqIF导入过程
%   使用MATLAB内置的slreq.import函数

success = false; %#ok<NASGU> % Will be set to true on successful import

% 创建进度对话框
progressDlg = uiprogressdlg(parentFigure, 'Title', '导入ReqIF', ...
    'Message', '正在准备导入ReqIF数据...', 'Indeterminate', 'on');

try
    % 准备导入选项
    updateMessage(messageTextArea, '配置ReqIF导入选项...');
    progressDlg.Message = '配置导入选项...';
    
    % 使用MATLAB内置的ReqIF导入功能
    updateMessage(messageTextArea, '调用MATLAB ReqIF导入接口...');
    progressDlg.Message = '正在解析ReqIF文件...';
    
    % 方法1: 直接使用slreq.import导入到现有需求集
    if ~isNewFile
        % 导入到现有需求集
        try
            slreq.import(reqifFilePath, 'TargetReqSet', targetReqSet);
            
            % 保存需求集
            progressDlg.Message = '正在保存需求集...';
            updateMessage(messageTextArea, '保存需求集文件...');
            targetReqSet.save();
            
        catch ME
            % 如果直接导入失败，尝试创建新需求集再合并
            progressDlg.Message = '尝试替代导入方法...';
            updateMessage(messageTextArea, '尝试替代导入方法...');
            
            % 创建临时需求集
            tempReqSet = slreq.import(reqifFilePath);
            
            % 将临时需求集的需求复制到目标需求集
            copyRequirementsToTarget(tempReqSet, targetReqSet);
            
            % 保存并关闭临时需求集
            tempReqSet.close();
            targetReqSet.save();
        end
    else
        % 导入到新文件 - 直接导入并保存为指定文件名
        try
            % 先导入到临时需求集
            tempReqSet = slreq.import(reqifFilePath);
            
            % 关闭原来的空需求集
            targetReqSet.close();
            
            % 保存临时需求集为目标文件
            progressDlg.Message = '正在保存新需求集...';
            updateMessage(messageTextArea, '保存新需求集文件...');
            tempReqSet.saveAs(targetFilePath);
            
            % 更新引用
            targetReqSet = tempReqSet;
            
        catch ME
            % 如果失败，恢复原始方法
            slreq.import(reqifFilePath, 'TargetReqSet', targetReqSet);
            targetReqSet.save();
        end
    end
    
    % 获取导入统计信息
    progressDlg.Message = '统计导入结果...';
    importedCount = getImportedRequirementsCount(targetReqSet);
    
    % 显示成功消息
    close(progressDlg);
    
    resultMsg = sprintf('ReqIF导入成功完成！\n\n导入的需求数量：%d个\n目标文件：%s', ...
        importedCount, targetFilePath);
    
    uialert(parentFigure, resultMsg, 'ReqIF导入完成', 'Icon', 'success');
    updateMessage(messageTextArea, sprintf('ReqIF导入成功！共导入%d个需求', importedCount));
    
    success = true;
    
catch ME
    if exist('progressDlg', 'var') && isvalid(progressDlg)
        close(progressDlg);
    end
    
    % 详细的错误处理
    errorMsg = sprintf('ReqIF导入失败：\n\n错误类型：%s\n错误详情：%s\n\n请检查：\n1. ReqIF文件格式是否正确\n2. 目标需求集文件是否可写\n3. MATLAB Requirements Toolbox许可证\n4. 文件路径中是否包含特殊字符', ...
        ME.identifier, ME.message);
    
    uialert(parentFigure, errorMsg, 'ReqIF导入错误', 'Icon', 'error');
    updateMessage(messageTextArea, sprintf('ReqIF导入失败：%s', ME.message));
    
    success = false;
end

end

function copyRequirementsToTarget(sourceReqSet, targetReqSet)
%COPYREQUIREMENTSTOTARGET 将源需求集的需求复制到目标需求集
%   当直接导入失败时使用的备用方法

try
    % 获取源需求集中的所有需求
    allReqs = slreq.find('Type', 'Requirement');
    sourceReqs = [];
    
    % 筛选属于源需求集的需求
    for i = 1:length(allReqs)
        if isequal(allReqs(i).reqSet, sourceReqSet)
            sourceReqs(end+1) = allReqs(i); %#ok<AGROW>
        end
    end
    
    % 复制需求到目标需求集
    for i = 1:length(sourceReqs)
        srcReq = sourceReqs(i);
        newReq = targetReqSet.add();
        
        % 复制基本属性
        if ~isempty(srcReq.Id)
            newReq.Id = srcReq.Id;
        end
        if ~isempty(srcReq.Summary)
            newReq.Summary = srcReq.Summary;
        end
        if ~isempty(srcReq.Description)
            newReq.Description = srcReq.Description;
        end
        
        % 复制其他可用属性
        try
            if ~isempty(srcReq.CreatedBy)
                newReq.CreatedBy = srcReq.CreatedBy;
            end
            if ~isempty(srcReq.CreatedOn)
                newReq.CreatedOn = srcReq.CreatedOn;
            end
            if ~isempty(srcReq.ModifiedBy)
                newReq.ModifiedBy = srcReq.ModifiedBy;
            end
            if ~isempty(srcReq.ModifiedOn)
                newReq.ModifiedOn = srcReq.ModifiedOn;
            end
        catch
            % 某些属性可能不可用，忽略错误继续
        end
    end
    
catch ME
    % 复制过程中的错误，重新抛出
    rethrow(ME);
end

end

function count = getImportedRequirementsCount(reqSet)
%GETIMPORTEDREQUIREMENTSCOUNT 获取需求集中的需求数量

try
    allReqs = slreq.find('Type', 'Requirement');
    count = 0;
    
    % 计算属于该需求集的需求数量
    for i = 1:length(allReqs)
        if isequal(allReqs(i).reqSet, reqSet)
            count = count + 1;
        end
    end
    
catch
    % 如果计算失败，返回0
    count = 0;
end

end

function updateMessage(messageTextArea, msg)
%UPDATEMESSAGE 安全地更新UI消息区域

if ~isempty(messageTextArea) && isvalid(messageTextArea)
    messageTextArea.Value = msg;
    drawnow;
end

end
